package com.kinyx.framework.vo;

import java.util.List;

import com.kinyx.framework.annotation.assist.CanNotNull;

import lombok.Getter;

/**
 * 分页输出数据
 * @param <D> 泛型
 */
@Getter
public class OutPageData<D> {

	/** 数据列表 */
	private final List<D> content;
	/** 数据总数 */
	private final long totalElements;
	/** 分页信息 */
	private final InPageData pageable;

	/**
	 * 构造方法
	 * @param content 数据列表
	 * @param totalElements 数据总数
	 * @param pageable 分页信息
	 */
	public OutPageData(@CanNotNull final List<D> content, @CanNotNull final long totalElements, @CanNotNull final InPageData pageable) {
		this.content = content;
		this.totalElements = totalElements;
		this.pageable = pageable;
	}

	/** @return 页面总数 */
	public int getTotalPages() { return this.pageable.getPageSize() == 0 ? 1 : (int) Math.ceil(this.totalElements / (double) this.pageable.getPageSize()); }

	/** @return 当前数据总数 */
	public int getNumberOfElements() { return this.content.size(); }

	/** @return true：有数据；false：无数据； */
	public boolean hasContent() {
		return !this.content.isEmpty();
	}

	/** @return true：有上一页数据；false：无上一页数据； */
	public boolean hasPrevious() {
		return this.pageable.getPageNumber() > 0;
	}

	/** @return true：有下一页数据；false：无下一页数据； */
	public boolean hasNext() {
		if (this.content.isEmpty()) { return false; }
		return (this.pageable.getPageNumber() + 1) < this.getTotalPages();
	}

	/** @return true：是第一页数据；false：非第一页数据； */
	public boolean isFirst() { return !this.hasPrevious(); }

	/** @return true：是最后一页数据；false：非最后一页数据； */
	public boolean isLast() {
		if (this.content.isEmpty()) { return true; }
		return !this.hasNext();
	}

}
